[R3 复现]Neon Deceit

反调试+迷宫+无用数据+无限循环+函数名异常

main 函数就只是一个 helloworld 然后退出,但是 exit 用来混淆逻辑,动调的时候需要把exit给 nop 掉,真正的主要逻辑在下面的sub_18597 中。

image-20250708213114837

跟进后发现伪代码逻辑不全,发现是_verrx混淆逻辑导致输出不全

image-20250708213114837

_verrx nop 掉重新分析函数,发现有反调试。先将一个加密过的字符串和 0x5A 进行异或,发现是一些 linux 常用调试器/反编译器的名称,分析这是一个基于名称查找的反调试,下面的cimag函数实际是退出函数。

image-20250708202709091

这里也是反调试的一环是一个无限循环,这个无限循环在逻辑中出现多次,调试的时候请务必多加小心

image-20250708203450966

image-20250708203541959

启动调试绕过反调试,经过输入之后,我们会这里的逻辑,其中 var_6980 存放着迷宫地图,var_6970 是存放着输入字符长度的地方,var_6968var_6970/2可能要进行什么操作

image-20250708204908853

迷宫地图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
###################################################
# # # # #
# ##### ### # # # ####### # # # ####### # ### # # #
# # # # # # # # # # # # # #
# ### ### # # # ########### # # # # # ########### #
# # # # # # # # # # # # # # # #
# # # # # # # ### # # # # # ##### # # ### ##### # #
# # # # # # # # # # # # # # # # # #
# # ### # # # # ##### # ### # ########### ####### #
# # # # # # # # # # # # # # # # # # # # # #
######################### # # # # # # # # # # # # #
# # # # #
####### ############# ##### # # # ### # ### ### # #
# # # # # # # # # # #
# # # # # ############# ###########################
# # # # # # #
# ### # # # # ### # # # # # # # # # # ### ### ### #
# # # # # # # # # # # # # # # # # # # # #
# # ##### # # # # ##### # # # # # ### # # # # # # #
# # # # # # # # # # # # # # # # # # # #
###################################################

整理后的地图及其路线和键盘输入:ffffffffffffd7d5556aa97d7ffffffffffffd57

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
███████████████████████████████████████████████████
dddddddddddddddddddddddddd█ █ █ █ █
█ █████ ███ █ █ █ ███████s█ █ █ ███████ █ ███ █ █ █
█ █ █ █ █ █ █ █ sdd █ █ █ █ █ █
█ ███ ███ █ █ █ ███████████s█ █ █ █ █ ███████████ █
█ █ █ █ █ █ █ █ █ █s█ █ █ █ █ █
█ █ █ █ █ █ █ ███ █ █ █ █ █s█████ █ █ ███ █████ █ █
█ █ █ █ █ █ █ █ █ █ s█ █ █ █ █ █ █ █
█ █ ███ █ █ █ █ █████ █ ███s█ ███████████ ███████ █
█ █ █ █ █ █ █ █ █ █s█ █ █ █ █ █ █ █ █ █ █ █
█████████████████████████ █s█ █ █ █ █ █ █ █ █ █ █ █
█ aaaaaas █ █ █ █
███████ █████████████s█████ █ █ █ ███ █ ███ ███ █ █
█ █ sdd█ █ █ █ █ █ █ █ █
█ █ █ █ █ █████████████s███████████████████████████
█ █ █ █ █ █ sdddddddddddddddddddddddddd█
█ ███ █ █ █ █ ███ █ █ █ █ █ █ █ █ █ █ ███ ███ ███s█
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ s█
█ █ █████ █ █ █ █ █████ █ █ █ █ █ ███ █ █ █ █ █ █s█
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █sd
███████████████████████████████████████████████████

经过调试我们可以知道下图左半部分是 flag 输出部分,右半部分是迷宫校验部分,

校验逻辑是带入的每个字节被拆分成 4 个 2 位 bit,按大端序排列,每个 2 位 bit 控制迷宫走向,00 为 w,01 为 s,10 为 a,11 为 d,var_6938 为当前 Y 轴,var_6938+4 为当前 X 轴

左半部分是校验部分

微信截图_20250708211917

把刚才的正确迷宫路线的字母带换成二进制的硬编码然后转换成 16 进制:ffffffffffffd7d5556aa97d7ffffffffffffd57

1
2
3
4
5
6
7
8
9
10
11
direction_str = "dddddddddddddddddddddddddssddssssssssaaaaaassddssddddddddddddddddddddddddddssssd"
direction_map = {
'd': '11',
'w': '00',
's': '01',
'a': '10'
}
binary_str = ''.join(direction_map[ch] for ch in direction_str)
byte_list = [binary_str[i:i+8].ljust(8, '0') for i in range(0, len(binary_str), 8)]
hex_str = ''.join(f"{int(b, 2):02x}" for b in byte_list)
print(hex_str)